import time
from datetime import datetime, timedelta
import calendar


class Time_Option:
    """
    时间处理类，包含一系列时间相关的操作方法
    """

    # 显示当前时间
    def show_current_time(self, mode: str = '%Y-%m-%d %H:%M:%S'):
        """
        显示当前时间

        返回：
        datetime：当前的日期和时间
        mode:返回格式
        """
        return datetime.now().strftime(mode)

    # 获取当前年份
    def current_year(self):
        """
        获取当前年份

        返回：
        int：当前的年份
        """
        return datetime.now().year

    # 获取当前月份
    def current_month(self):
        """
        获取当前月份

        返回：
        int：当前的月份（1 - 12）
        """
        return datetime.now().month

    # 获取当前日
    def current_day(self):
        """
        获取当前日

        返回：
        int：当前的日（1 - 31）
        """
        return datetime.now().day

    # 获取当前星期几
    def current_weekday(self):
        """
        获取当前星期几，0 表示星期一，6 表示星期日

        返回：
        int：当前的星期几
        """
        return datetime.now().weekday()

    # 获取当前小时
    def current_hour(self):
        """
        获取当前小时

        返回：
        int：当前的小时（0 - 23）
        """
        return datetime.now().hour

    # 获取当前分钟
    def current_minute(self):
        """
        获取当前分钟

        返回：
        int：当前的分钟（0 - 59）
        """
        return datetime.now().minute

    # 获取当前秒数
    def current_second(self):
        """
        获取当前秒数

        返回：
        int：当前的秒数（0 - 59）
        """
        return datetime.now().second

    # 计算x天后的日期
    def calculate_date_after_x_days(self, x):
        """
        计算 x 天后的日期

        参数：
        x (int)：要增加的天数

        返回：
        datetime：x 天后的日期和时间
        """
        return datetime.now() + timedelta(days=x)

    # 计算 x 秒后的时间
    def calculate_time_after_x_seconds(self, x):
        """
        计算 x 秒后的时间

        参数：
        x (int)：要增加的秒数

        返回：
        datetime：x 秒后的日期和时间
        """
        return datetime.now() + timedelta(seconds=x)

    # 获取当前日期
    def current_date(self):
        """
        获取当前日期

        返回：
        date：当前的日期
        """
        return datetime.now().date()

    # 开始计时，记录起始时间
    def start_timing(self):
        """
        开始计时，记录起始时间
        """
        self.start_time = datetime.now()

    # 结束计时，并返回计时结果
    def end_timing(self):
        """
        结束计时，并返回计时结果

        返回：
        timedelta：起始时间与结束时间的时间差
        """
        end_time = datetime.now()
        return end_time - self.start_time

    # 显示当前时间戳
    def show_current_timestamp(self):
        """
        显示当前时间戳

        返回：
        float: 当前的时间戳
        """
        return datetime.now().timestamp()

    # 将给定的时间戳转化为日期
    def timestamp_to_date(self, timestamp):
        """
        将给定的时间戳转化为日期

        参数:
        timestamp (int): 要转换的时间戳

        返回:
        datetime: 对应的日期和时间
        """
        return datetime.fromtimestamp(timestamp)

    def timesleep(self, sec):
        return time.sleep(sec)

    def date_str_to_timestamp(self, date_str):
        """
        将日期字符串 '2025年3月18日' 转换为时间戳

        参数:
        date_str (str): 要转换的日期字符串

        返回:
        float: 对应的时间戳
        """
        try:
            dt = datetime.strptime(date_str, '%Y年%m月%d日')
            return dt.timestamp()
        except ValueError:
            print("输入的日期格式不正确，请使用 'YYYY年MM月DD日' 格式。")
            return None

    def date_difference_in_days(self, timestamp1, timestamp2):
        """
        计算两个日期戳所代表日期之间相差的天数

        参数:
        timestamp1 (float): 第一个日期的时间戳
        timestamp2 (float): 第二个日期的时间戳

        返回:
        int: 两个日期之间相差的天数
        """
        try:
            dt1 = datetime.fromtimestamp(timestamp1)
            dt2 = datetime.fromtimestamp(timestamp2)
            delta = abs(dt1 - dt2)
            return delta.days
        except (ValueError, OSError):
            print("输入的时间戳格式不正确，请使用有效的时间戳。")
            return None

    def date_plus_x_days_to_timestamp(self, timestamp, x):
        """
        返回指定日期戳加上 x 天后的日期戳

        参数:
        timestamp (float): 要转换的日期戳
        x (int): 要增加的天数

        返回:
        float: 指定日期戳加上 x 天后的日期戳
        """
        try:
            dt = datetime.fromtimestamp(timestamp)
            new_date = dt + timedelta(days=x)
            return new_date.timestamp()
        except (ValueError, OSError):
            print("输入的时间戳格式不正确，请使用有效的时间戳。")
            return None

    # 根据时间戳获取星期几
    def get_weekday_from_timestamp(self, timestamp):
        """
        根据给定的时间戳返回对应的星期几，0 表示星期一，6 表示星期日

        参数:
        timestamp (float): 要转换的时间戳

        返回:
        int: 对应的星期几
        """
        try:
            dt = datetime.fromtimestamp(timestamp)
            return dt.weekday()
        except (ValueError, OSError):
            print("输入的时间戳格式不正确，请使用有效的时间戳。")
            return None

    def get_max_days_of_month(self, month, year=None):
        """
        根据输入的月份和年份，返回该月的最大天数。

        参数:
        month (int): 月份，范围为 1 到 12。
        year (int, 可选): 年份，默认为当前年份。

        返回:
        int: 该月的最大天数。
        """
        if year is None:
            year = self.current_year()
        _, max_days = calendar.monthrange(year, month)
        return max_days
